// Copyright 2019 Proyectos y Sistemas de Mantenimiento SL (eProsima).
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ------------------------------------------------------------------
// Modification history:
// feature: listener code decoupling
// feature: develop dispatcher
// feature: add statictic lookup
// ------------------------------------------------------------------

#ifndef LOOKUP_REPLY_LISTENER_HPP_
#define LOOKUP_REPLY_LISTENER_HPP_
#ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC
#include <ertps/rtps/reader/ReaderListener.h>
#include <history/WriterListener.h>
#include <ertps/types/TypeObjectFactory.h>
#include <edds/dds/builtin/lookup/common/LookupTypes.hpp>

using evbs::ertps::types::TypeObjectFactory;
namespace evbs {
namespace ertps {
namespace rtps {
class RTPSReader;

}  // namespace rtps
}  // namespace ertps

using vbs::common::CacheChange_t;
namespace edds {
namespace dds {
namespace builtin {

class LookupManager;

/**
 * Class LookupReplyListener that receives the lookup request messages of remote endpoints.
 * @ingroup TYPES_MODULE
 */
class LookupReplyListener : public vbs::common::ReaderListener, public vbs::common::WriterListener {
 public:
    /**
     * @brief Constructor
     * @param pwlp Pointer to the writer liveliness protocol
     */
    LookupReplyListener(LookupManager* pwlp);

    /**
     * @brief Destructor
     */
    ~LookupReplyListener() override;

    /**
     * @brief Method call when this class is notified of a new cache change
     * @param reader The reader receiving the cache change
     * @param change The cache change
     */
    void onNewCacheChangeAdded(vbs::dispatcher::SubstrateReader* const sub_reader,
                               const vbs::common::CacheChange_t* const change) override;

    void onWriterChangeReceivedByAll(vbs::dispatcher::SubstrateWriter* const writer,
                                     vbs::common::CacheChange_t* change) override;

 private:
    //! A pointer to the lookup manager
    LookupManager* tlm_;

    //! A pointer to the TypeObject factory.
    ertps::types::TypeObjectFactory* factory_;
};

} /* namespace builtin */
} /* namespace dds */
} /* namespace edds */
} /* namespace evbs */
#endif
#endif /* LOOKUP_REPLY_LISTENER_HPP_*/
